home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1995 January
/
Simtel - 10000 MSDOS Shareware Programs (Walnut Creek)(January 1995)(Disc 2).ISO
/
disc2
/
turbopas
/
dskrd_wr.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1987-12-23
|
4KB
|
97 lines
Date: Mon, 16 Nov 87 09:39:01 EST
From: nelson @ clutx.clarkson.edu
Subject: Absolute disk read/write from Turbo Pascal v6.68
Yes, you CAN use INT 13 to read/write disks instead of INT 25 and INT 26.
Unfortunately, if you do, then your program will not work with installed
device drivers, like a ramdisk. I found this out the hard way when the
disk recovery program that I wrote couldn't recover my ramdisk. Ouch!
{ module rwsector.inc -- module to read and write absolute sectors }
{ Copyright 1986, Russell Nelson. Freely copyable for all uses so long
as this copyright message and following authorship notice are retained.
Author:
Russell Nelson
11 Grant St.
Potsdam, N.Y. 13676
GEnie: BH01 Compu$erve: 70441,205
BITNET: NELSON@CLUTX Internet: nelson@clutx.clarkson.edu
Usage:
If, for any reason, you want to read/write an absolute sector, this code
will do it for you. Note that the count must be a variable, not an
expression. The count is set to the number of sectors not read/written.
Exports:
function read_sector(unit, sectno : integer; var count : integer; var buffer)
: integer;
function write_sector(unit, sectno : integer; var count : integer; var buffer)
: integer;
Example:
var
sector : array[0..511];
error : integer;
count : integer;
begin
count := 1;
error := read_sector(0, 0, count, sector);
end.
}
{ return -1 if no errors, or error number if error. }
function read_sector(unit, sectno : integer; var count : integer; var buffer)
: integer;
begin
inline(
$1E/ { push ds }
$C5/ $5E/ $04/ { lds bx,dword ptr 4[bp] }
$8B/ $56/ $0C/ { mov dx,12[bp] }
$8B/ $46/ $0E/ { mov ax,14[bp] }
$C4/ $7E/ $08/ { les di,8[bp] }
$26/ $8B/ $0D/ { mov cx,es:[di] }
$55/ { push bp }
$CD/ $25/ { int 25h }
$5D/ { pop bp }
$5D/ { pop bp }
$72/ $02/ { jc rsect_1 }
$B0/ $FF/ { mov al,-1 }
$98/ {rsect_1: cbw }
$89/ $46/ $10/ { mov 16[bp],ax }
$C4/ $7E/ $08/ { les di,8[bp] }
$26/ $89/ $0D/ { mov es:[di],cx }
$1F { pop ds }
);
end;
{ return -1 if no errors, or error number if error. }
function write_sector(unit, sectno : integer; var count : integer; var buffer)
: integer;
begin
inline(
$1E/ { push ds }
$C5/ $5E/ $04/ { lds bx,dword ptr 4[bp] }
$8B/ $56/ $0C/ { mov dx,12[bp] }
$8B/ $46/ $0E/ { mov ax,14[bp] }
$C4/ $7E/ $08/ { les di,8[bp] }
$26/ $8B/ $0D/ { mov cx,es:[di] }
$55/ { push bp }
$CD/ $26/ { int 26h }
$5D/ { pop bp }
$5D/ { pop bp }
$72/ $02/ { jc wsect_1 }
$B0/ $FF/ { mov al,-1 }
$98/ {wsect_1: cbw }
$89/ $46/ $10/ { mov 16[bp],ax }
$C4/ $7E/ $08/ { les di,8[bp] }
$26/ $89/ $0D/ { mov es:[di],cx }
$1F { pop ds }
);
end;